// 封装购物车模块
import { defineStore } from "pinia";
import { ref, computed } from "vue";
import { useUserStore } from "./userStore";
import { insertCartAPI, findNewCartListAPI, delCartAPI } from "@/apis/cart";

export const useCartStore = defineStore(
    "cart",
    () => {
        // 获取登录信息
        const userStore = useUserStore();
        const isLogin = computed(() => userStore.userInfo.token);

        //更新列表
        const updateNewList = async () => {
            const res = await findNewCartListAPI();
            cartList.value = res.result;
        };
        // 1. 定义state - cartList
        const cartList = ref([]);
        // 2. 定义action - addCart
        const addCart = async (goods) => {
            const { skuId, count } = goods;
            // console.log("添加", goods);
            // 登录
            if (isLogin.value) {
                // 登录之后的加入购车逻辑
                await insertCartAPI({ skuId, count });
                updateNewList();
            } else {
                // 未登录本地逻辑
                // 添加购物车操作
                // 已添加过 - count + 1
                // 没有添加过 - 直接push
                // 思路：通过匹配传递过来的商品对象中的skuId能不能在cartList中找到，找到了就是添加过
                const item = cartList.value.find(
                    (item) => goods.skuId === item.skuId
                );
                if (item) {
                    // 找到了
                    item.count += goods.count;
                } else {
                    // 没找到
                    cartList.value.push(goods);
                }
            }
        };

        // 3. 定义action - delCart
        const delCart = async (skuId) => {
            if (isLogin.value) {
                // 登录之后的删除购车逻辑
                // 调用接口实现接口购物车中的删除功能
                await delCartAPI([skuId]);
                updateNewList();
            } else {
                // 未登录本地逻辑
                // 思路：
                // 1. 找到要删除项的下标值 - splice
                // const idx = cartList.value.findIndex(
                //     (item) => skuId === item.skuId
                // );
                // cartList.value.splice(idx, 1);
                // 2. 使用数组的过滤方法 - filter
                cartList.value = cartList.value.filter(
                    (item) => item.skuId !== skuId
                );
            }
        };

        // 清除购物车
        const clearCart = () => {
            cartList.value = [];
        };

        // 计算属性
        // 1 总的数量
        const allCount = computed(() =>
            cartList.value.reduce((sum, cur) => sum + cur.count, 0)
        );
        // 2 总价
        const allPrice = computed(() =>
            cartList.value.reduce((sum, cur) => sum + cur.count * cur.price, 0)
        );

        // 3. 已选择数量
        const selectedCount = computed(() =>
            cartList.value
                .filter((item) => item.selected)
                .reduce((a, c) => a + c.count, 0)
        );
        // 4. 已选择商品价钱合计
        const selectedPrice = computed(() =>
            cartList.value
                .filter((item) => item.selected)
                .reduce((a, c) => a + c.count * c.price, 0)
        );

        // 单选功能
        const singleCheck = (skuId, selected) => {
            // 通过skuId找到要修改的那一项 然后把它的selected修改为传过来的selected
            const item = cartList.value.find((item) => item.skuId === skuId);
            item.selected = selected;
        };

        // 全选功能action
        const allCheck = (selected) => {
            // 把cartList中的每一项的selected都设置为当前的全选框状态
            cartList.value.forEach((item) => (item.selected = selected));
        };

        // 是否全选计算属性
        const isAll = computed(() =>
            cartList.value.every((item) => item.selected)
        );
        return {
            cartList,
            allCount,
            allPrice,
            isAll,
            selectedCount,
            selectedPrice,
            addCart,
            delCart,
            singleCheck,
            allCheck,
            clearCart,
            updateNewList,
        };
    },
    {
        persist: true,
    }
);
